package com.hyper_yang.javase.fileAndIO;

import org.junit.jupiter.api.Test;

import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.io.IOException;

// 路径分隔符: windows: \  unix: /
public class FileTest {
    @Test
    public void createFile() {
        // 方法一:
        File file1 = new File("D:\\store install\\idea project\\javaSE\\src\\main\\java\\com\\hyper_yang\\fileAndIO\\testFile\\a.text");
        // 方法二:
        File fileParent = new File("D:\\store install\\idea project\\javaSE\\src\\main\\java\\com\\hyper_yang\\fileAndIO\\testFile");
        File file2 = new File(fileParent, "a.text");
        // 方法三:
        File file3 = new File("D:\\store install\\idea project\\javaSE\\src\\main\\java\\com\\hyper_yang\\fileAndIO\\testFile\\", "a.text");

        // todo: 对文件或文件夹做创建操作
        File file = new File("src\\main\\java\\com\\hyper_yang\\fileAndIO\\testFile\\b.txt");

        // 判断文件是否存在
        if (file.exists()) {
            System.out.println(file.getAbsolutePath());
            System.out.println(file.getPath());
        } else {
            try {
                file.createNewFile();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }

        // 文件夹创建 mkdir()、mkdirs() 省略测试
    }

    @Test
    public void getFile() {
        File file = new File("D:\\store install\\idea project\\javaSE\\src\\main\\java\\com\\hyper_yang\\fileAndIO\\testFile\\a.text");
        // 获取绝对路径
        System.out.println(file.getAbsolutePath());

        // 获取封装路径，new File("路径") 是这个“路径”
        System.out.println(file.getPath());

        // 获取文件名
        System.out.println(file.getName());

        // 获取文件大小 字节为单位
        System.out.println(file.length());

        // 获取文件修改时间
        System.out.println(file.lastModified());
    }

    @Test
    public void deleteFile() {
        File file = new File("src\\main\\java\\com\\hyper_yang\\fileAndIO\\testFile\\b.txt");
        // 删除文件不进回收站，删除文件夹则文件夹必须是空的
//        file.delete();
        // 在虚拟机正常退出后，再进行删除
        file.deleteOnExit();

        // 判断是否是文件、是否是文件夹、是否存在
        System.out.println(file.isFile());
        System.out.println(file.isDirectory());
        System.out.println(file.exists());
    }

    @Test
    public void traverseDirectory() {
        File file = new File("src\\main\\java\\com\\hyper_yang\\fileAndIO\\testFile");
        // list() 返回抽象路径下的所有内容的名字
//        String[] list = file.list();
//        for (String s : list) {
//            System.out.println(s);
//        }

//        String[] text = file.list(new FilenameFilter() {
//            /**
//             * @param dir    the directory in which the file was found.
//             * @param name   the name of the file.
//             * @return
//             */
//            @Override
//            public boolean accept(File dir, String name) {
//                return name.endsWith(".txt");
//            }
//        });
        String[] text = file.list((dir, name) -> name.endsWith(".txt"));
        for (String t : text) {
            System.out.println(t);
        }
    }

    @Test
    public void traverseFile() {

        File file = new File("src\\main\\java\\com\\hyper_yang");
        // listFiles() 获取的是文件夹或文件的对象
//        for (File listFile : file.listFiles()) {
//            System.out.println(listFile);
//            System.out.println(listFile.getName() + "\t" + listFile.length());
//        }
        // 拿到一级所有文件、文件夹
        // todo: 文件: 判断是否以 .java为结尾
        // todo: 文件夹: 再次 .listFiles
        showJavaFile(file);
    }

    public void showJavaFile(File file){
//        for (File f : file.listFiles()) {
//            if (f.isFile()) {
//                if (f.getName().endsWith(".java"))
//                    System.out.println(f.getName());
//            } else {
//                showJavaFile(f);
//            }
//        }
        File[] files = file.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                if (pathname.isFile()) {
                    if (pathname.getName().endsWith(".java"))
                        return true;
                } else {
                    return true;
                }
                return false;
            }
        });
        for (File f : file.listFiles()) {
            if (f.isFile()) {
                System.out.println(f.getName());
            } else {
                showJavaFile(f);
            }
        }
    }
}